// 延迟函数
const sleep = time => new Promise(resolve => setTimeout(resolve, time));

class Scheduler2 {
    constructor(limit) {
        this.limit = limit
        this.count = 0
        this.queue = []
    }
    add(fn) {
        return new Promise((resolve, reject) => {
            //? 添加队列 必须要把属于此次任务的resolve/reject保存下来
            this.queue.push({fn,resolve,reject})
            this.run()
        })
    }
    run() {
        //? 这里是池子大小判断
        if (this.limit <= this.count || this.queue.length === 0) return
        this.count++
        //? 取出队列中的第一个执行
        const {fn,resolve,reject} = this.queue.shift()
        //? 等待fn函数完成后返回一个promise,减少并发 并再调下一个任务
        return fn().then(_ => {
            resolve()
            this.count--
            //? 完成一个后才会执行 继续取下一个任务
            this.run()
        })
    }
}


// 同时进行的任务最多2个
const scheduler = new Scheduler2(2);

// 添加异步任务
// time: 任务执行的时间
// val: 参数
//? 与题1的区别在于add返回Promise
const addTask = (time, val) => {
    scheduler.add(() => {
        return sleep(time)
    }).then(() => console.log(val));
};

addTask(1000, '1');
addTask(500, '2');
addTask(300, '3');
addTask(400, '4');
// 2
// 3
// 1
// 4
